<?php
namespace action\forum;
use \cass\formulaire AS form,
        \cass\Cache;

class discussionAction extends \cass\Action {

    /**
     * Méthode de cache
     * @return Integer Type de cache (Cache::<type>)
     */
    public function cache() {
        return array(
            'execute' => Cache::SESSION_MULTIPLE
        );
    }

    /**
     * Méthode d'affichage du forum
     */
    public function execute($_discussion, $_discussionName, $_page = 1) {
        $discussion = $this->doctrine->find('ForumsDiscussion', $_discussion);
        $this->forwardEven($discussion->getForum()->hasCredential($this->getSession()), '@403');

        $this->setTitle($discussion->getTitle());
        $this->addToAriane('Forums', url_for('forum'));
        $this->addToAriane($discussion->getForum()->getTitle(), url_for('forum', 'forum', null, array($discussion->getForum()->getId(), slugify($discussion->getForum()->getTitle()))));
        


        $query = $this->doctrine->createQuery('SELECT m FROM ForumsMessage m JOIN m.discussion d WHERE d.id = :discussion')
                        ->setParameter('discussion', $_discussion);

        // Message lu
        $discussion->read($this->getSession());
        $this->doctrine->flush($discussion);

        $pagination = new \cass\Pagination($query);
        $pagination->setUri(\cass\Uri::create('forum', 'discussion', null, array($_discussion, $_discussionName)));
        $pagination->setCurrentPage($_page);
        $pagination->setNbByPage(\cass\Data::config('forum')->nb_messages);
        
        $this->discussion = $discussion;
        $this->pagination = $pagination;
        $this->messages   = $pagination->getElements();
    }

     /**
     * Créer un message dans une discussion
     * @param $_discussion Id de la discussion
     * @param $_discussionName Nom slug de la discussion
     */
    public function executeCreateMessage($_discussion, $_discussionName) {
        $discussion = $this->doctrine->find('ForumsDiscussion', $_discussion);
        $this->forwardEven($discussion->getForum()->hasCredential($this->getSession()), '@403');

        $this->setTitle($discussion->getTitle());
        $this->addToAriane('Forums', url_for('forum'));
        $this->addToAriane($discussion->getForum()->getTitle(), url_for('forum', 'forum', null, array($discussion->getForum()->getId(), slugify($discussion->getForum()->getTitle()))));

        $formulaire = new form\Formulaire('Répondre à la discussion');
        $formulaire->setButtons('submit', 'Répondre à la discussion');
        $formulaire->addToLinks('Retour à la discussion', url_for('forum', 'discussion', null, array($_discussion, $_discussionName)));
        $formulaire->append(new form\Editor('Message', '', true, 'Relisez-vous bien, n\'utilisez pas le SMS et évitez les fautes évidentes'));
        $formulaire->append(new form\Hidden('Nombre messages', $discussion->getMessages()->count()));
        
        // Vérifications
        if ($formulaire->isPosted()) {
            if ( $formulaire->getValue('Nombre messages') < $discussion->getMessages()->count() ) {
                $formulaire->{'Message'}->setError('Un (ou plusieurs) message(s) a (ont) été posté(s) pendant que vous écriviez le vôtre. Repostez');
                $formulaire->{'Nombre messages'}->setValue($discussion->getMessages()->count());
            }
        }

        // Enregistrements
        if ($formulaire->isPostedWithoutError()) {
            $discussion->setUpdatedAt(new \DateTime('now'));
            $discussion->getReaders()->clear();
            $discussion->getReaders()->add($this->getSession()->getUser());
            $this->doctrine->persist($discussion);

            $message = new \ForumsMessage;
            $message->setUser($this->getSession()->getUser());
            $message->setCreatedAt(new \DateTime('now'));
            $message->setDiscussion($discussion);
            $message->setContent($formulaire->getValue('Message'));
            $this->doctrine->persist($message);

            $this->doctrine->flush();

            $formulaire->setConfirm('La réponse au sujet de discussion a été ajouté, vous pouvez <a href="'.url_for('forum', 'discussion', null, array($_discussion,$_discussionName)).'#message'.$message->getId().'">voir votre message</a>.');
        }

        $this->formulaire = $formulaire;
    }

    /**
     * Créer un message dans une discussion
     * @param $_discussion Id de la discussion
     * @param $_discussionName Nom slug de la discussion
     */
    public function executeEditMessage($_message, $_messageName) {
        $message = $this->doctrine->find('ForumsMessage', $_message);
        $this->forwardEven($message->getDiscussion()->getForum()->hasCredential($this->getSession()), '@403');
        $this->forwardEven(($message->getUser()->getId()==$this->getSession()->getUser()->getId() OR $this->getSession()->hasCredential('forums_edit')), '@403');

        $this->setTitle('Modification d\'un message');
        $this->addToAriane('Forums', url_for('forum'));
        $this->addToAriane($message->getDiscussion()->getForum()->getTitle(), url_for('forum', 'forum', null, array($message->getDiscussion()->getForum()->getId(), slugify($message->getDiscussion()->getForum()->getTitle()))));
        $this->addToAriane($message->getDiscussion()->getTitle(), url_for('forum', 'discussion', null, array($message->getDiscussion()->getId(), slugify($message->getDiscussion()->getTitle()))));

        $formulaire = new form\Formulaire('Modifier un message');
        $formulaire->setButtons('submit', 'Modifier le message');
        $formulaire->addToLinks('Retour à la discussion', url_for('forum', 'discussion', null, array($message->getDiscussion()->getId(), slugify($message->getDiscussion()->getTitle()))) . '#message'.$message->getId());
        $formulaire->append(new form\Editor('Message', $message->getContent(), true, 'Relisez-vous bien, n\'utilisez pas le SMS et évitez les fautes évidentes'));

        // Vérifications
        if ($formulaire->isPosted()) {
         
        }

        // Enregistrements
        if ($formulaire->isPostedWithoutError()) {
            
            $message = new \ForumsMessage;
            $message->setUpdatedAt(new \DateTime('now'));
            $message->setContent($formulaire->getValue('Message'));
            $this->doctrine->persist($message);

            $this->doctrine->flush();

            $formulaire->setConfirm('Le message a été modifié, vous pouvez <a href="'.url_for('forum', 'discussion', null, array($message->getDiscussion()->getId(), slugify($message->getDiscussion()->getTitle()))).'#message'.$message->getId().'">voir votre message</a>.');
        }

        $this->formulaire = $formulaire;
    }


}